#include"List.h"

static SLNode* BuySLNode(SLDataType x)
{
	SLNode* newNode = (SLNode*)malloc(sizeof(SLNode));
	if (NULL == newNode)
	{
		perror("malloc failed");
		exit(-1);
	}
	newNode->data = x;
	newNode->prev = newNode;
	newNode->next = newNode;
	return newNode;
}




SLNode* SLInit()
{
	return BuySLNode(0);
}

void SLPushFront(SLNode* head, SLDataType x)
{
	assert(head);
	//SLInsertBF(head->next, x);
	SLInsertAF(head, x);
}

void SLPushBack(SLNode* head, SLDataType x)
{
	assert(head);
	//SLInsertBF(head, x);
	SLInsertAF(head->prev, x);
}

SLDataType SLPopBack(SLNode* head)
{
	assert(head);
	assert(head->prev != head);
	return SLErase(head->prev);
}


SLDataType SLPopFront(SLNode* head)
{
	assert(head);
	assert(head->next != head);
	return SLErase(head->next);
}

SLDataType SLErase(SLNode* Del)
{
	assert(Del);
	Del->prev->next = Del->next;
	Del->next->prev = Del->prev;
	SLDataType ret = Del->data;
	free(Del);
	return ret;
}

void SLInsertBF(SLNode* AFnode, SLDataType x)
{
	assert(AFnode);
	SLNode* newnode = BuySLNode(x);
	AFnode->prev->next = newnode;
	newnode->prev = AFnode->prev;
	AFnode->prev = newnode;
	newnode->next = AFnode;
}

void SLInsertAF(SLNode* BFnode, SLDataType x)
{
	assert(BFnode);
	SLNode* newnode = BuySLNode(x);
	BFnode->next->prev = newnode;
	newnode->next = BFnode->next;
	BFnode->next = newnode;
	newnode->prev = BFnode;
}

void SLDestroy(SLNode** phead)
{
	while ((*phead)->next != *phead)
		SLPopBack(*phead);
	free(*phead);
}